Slightly rework clip handling
authorTimm Bäder <mail@baedert.org>
Fri, 5 May 2017 12:06:01 +0000 (14:06 +0200)
committerMatthias Clasen <mclasen@redhat.com>
Thu, 20 Jul 2017 01:27:12 +0000 (21:27 -0400)
always initialize clips to the (content) allocation, don't walk up the
widget hierarchy in gtk_widget_set_clip, implement
gtk_widget_size_allocate in GtkSeparator. This way we don't end up using
uninitialized clip values.

The entire clip handling is up for major rework since we can't and don't
want to force every single widget to call _set_clip in size-allocate
implementations.

gtk/gtkactionbar.c
gtk/gtkcheckbutton.c
gtk/gtkcombobox.c
gtk/gtkgrid.c
gtk/gtkicon.c
gtk/gtklevelbar.c
gtk/gtknotebook.c
gtk/gtkseparator.c
gtk/gtkspinbutton.c
gtk/gtkstack.c
gtk/gtkwidget.c

index 537a319ae13da29a205a6ab99939bb8fdddab8e8..c645769f2e6ee9b176966e728e798b7d9524891f 100644 (file)
@@ -272,7 +272,7 @@ gtk_action_bar_size_allocate (GtkWidget     *widget,
                               GtkAllocation *allocation)
 {
   GtkActionBarPrivate *priv = gtk_action_bar_get_instance_private (GTK_ACTION_BAR (widget));
-  GtkAllocation clip;
+  GtkAllocation clip = *allocation;
 
   gtk_widget_size_allocate (priv->revealer, (GtkAllocation *)allocation);
   gtk_widget_get_clip (priv->revealer, &clip);
index 691b740d0d7b7a683c799fa0f7116603c4aa2c3f..3b3c52b61e24cafe4ab8f4ad57e1264448222488 100644 (file)
@@ -415,7 +415,7 @@ gtk_check_button_size_allocate (GtkWidget     *widget,
                                GtkAllocation *allocation)
 {
   GtkCheckButtonPrivate *priv = gtk_check_button_get_instance_private (GTK_CHECK_BUTTON (widget));
-  GdkRectangle clip;
+  GdkRectangle clip = *allocation;
 
   if (priv->draw_indicator)
     {
index b367b0a7e8873bbc867ff8d1a1c326819f2fbf88..f5c7ce4a04d0f99641b74aae9fd5f23185902110 100644 (file)
@@ -372,7 +372,7 @@ gtk_combo_box_size_allocate (GtkWidget     *widget,
 {
   GtkComboBox *combo_box = GTK_COMBO_BOX (widget);
   GtkComboBoxPrivate *priv = combo_box->priv;
-  GtkAllocation clip;
+  GtkAllocation clip = *allocation;
 
   gtk_widget_size_allocate_with_baseline (priv->box, allocation,
                                           gtk_widget_get_allocated_baseline (widget));
index f41054ae3b905a3bf8653ff7494566ae7aa78cdb..937f3bb4ff310fc75b87c486b0cb6368959f5fcb 100644 (file)
@@ -1588,7 +1588,7 @@ gtk_grid_size_allocate (GtkWidget     *widget,
                         GtkAllocation *allocation)
 {
   GtkAllocation clip = *allocation;
-  GtkAllocation children_clip;
+  GtkAllocation children_clip = *allocation;
   GtkGrid *grid = GTK_GRID (widget);
   GtkGridPrivate *priv = grid->priv;
   GtkGridRequest request;
index c22c071c311563918b0ed4da853d2a64716d931a..1ea9fd3ec50378ae3a01a33ba2d931d1c4deb1f1 100644 (file)
@@ -118,7 +118,7 @@ gtk_icon_size_allocate (GtkWidget     *widget,
 {
   GtkIcon *self = GTK_ICON (widget);
   GtkIconPrivate *priv = gtk_icon_get_instance_private (self);
-  GtkAllocation clip;
+  GtkAllocation clip = *allocation;
 
   gtk_css_gadget_allocate (priv->gadget, allocation,
                            gtk_widget_get_allocated_baseline (widget),
index 6cc32e4e549de0234716afd35ae5271f69382407..077ea00ec57fa11a1ce0a2723f29346b83d221ce 100644 (file)
@@ -534,9 +534,7 @@ gtk_level_bar_size_allocate (GtkWidget     *widget,
                              GtkAllocation *allocation)
 {
   GtkLevelBarPrivate *priv = gtk_level_bar_get_instance_private (GTK_LEVEL_BAR (widget));
-  GtkAllocation clip;
-
-  GTK_WIDGET_CLASS (gtk_level_bar_parent_class)->size_allocate (widget, allocation);
+  GtkAllocation clip = *allocation;
 
   gtk_widget_size_allocate (priv->trough_widget, allocation);
   gtk_widget_get_clip (priv->trough_widget, &clip);
index 9073f81b14ca6131505b1f567754c7da22957925..13b4e81a6fd6553c69bab8a8ff83d77f204018a8 100644 (file)
@@ -2264,9 +2264,7 @@ gtk_notebook_size_allocate (GtkWidget     *widget,
 {
   GtkNotebook *notebook = GTK_NOTEBOOK (widget);
   GtkNotebookPrivate *priv = notebook->priv;
-  GtkAllocation clip;
-
-  gtk_widget_set_allocation (widget, allocation);
+  GtkAllocation clip = *allocation;
 
   gtk_css_gadget_allocate (priv->gadget,
                            allocation,
index ebb2f5070255f61ca19df27593950bf3f2b6b91d..5306b8e95b1bc9e1f7bb7987294ee16f9e0ef566 100644 (file)
@@ -123,12 +123,21 @@ gtk_separator_init (GtkSeparator *separator)
   _gtk_orientable_set_style_classes (GTK_ORIENTABLE (separator));
 }
 
+static void
+gtk_separator_size_allocate (GtkWidget     *widget,
+                             GtkAllocation *allocation)
+{
+  gtk_widget_set_clip (widget, allocation);
+}
+
 static void
 gtk_separator_class_init (GtkSeparatorClass *class)
 {
   GObjectClass *object_class = G_OBJECT_CLASS (class);
   GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (class);
 
+  widget_class->size_allocate = gtk_separator_size_allocate;
+
   object_class->set_property = gtk_separator_set_property;
   object_class->get_property = gtk_separator_get_property;
 
index a105a3a6d811d9a5c18c5bc5579e16c80d2d11bc..f8ba5d04e64a075de2621be41926152d5818c82c 100644 (file)
@@ -1057,7 +1057,7 @@ gtk_spin_button_size_allocate (GtkWidget     *widget,
                                GtkAllocation *allocation)
 {
   GtkSpinButtonPrivate *priv = gtk_spin_button_get_instance_private (GTK_SPIN_BUTTON (widget));
-  GtkAllocation clip;
+  GtkAllocation clip = *allocation;
 
   gtk_widget_size_allocate_with_baseline (priv->box, allocation,
                                           gtk_widget_get_allocated_baseline (widget));
index 4a0d6f9115b04057bfe241fc43483e5f4a33946c..8b9d160a0ad3b785f8d3d2d345d91f774be6f213 100644 (file)
@@ -2120,9 +2120,7 @@ gtk_stack_size_allocate (GtkWidget     *widget,
 {
   GtkStack *stack = GTK_STACK (widget);
   GtkStackPrivate *priv = gtk_stack_get_instance_private (stack);
-  GtkAllocation clip;
-
-  gtk_widget_set_allocation (widget, allocation);
+  GtkAllocation clip = *allocation;
 
   gtk_css_gadget_allocate (priv->gadget,
                            allocation,
index 64cbcf17a60b7ab085faaf14cfded805841c5dd0..ea8fa4c153e1287044958117887529b91fd99857 100644 (file)
@@ -3853,6 +3853,7 @@ gtk_widget_init (GTypeInstance *instance, gpointer g_class)
   priv->allocation.y = -1;
   priv->allocation.width = 1;
   priv->allocation.height = 1;
+  priv->clip = priv->allocation;
   priv->user_alpha = 255;
   priv->alpha = 255;
   priv->window = NULL;
@@ -13488,24 +13489,6 @@ gtk_widget_set_clip (GtkWidget           *widget,
   allocation.width += shadow.left + shadow.right;
   allocation.height += shadow.top + shadow.bottom;
   gdk_rectangle_union (&allocation, clip, &priv->clip);
-
-
-  while (priv->parent &&
-         _gtk_widget_get_window (widget) == _gtk_widget_get_window (priv->parent))
-    {
-      GtkWidgetPrivate *parent_priv = priv->parent->priv;
-      GdkRectangle union_rect;
-
-      gdk_rectangle_union (&priv->clip,
-                           &parent_priv->clip,
-                           &union_rect);
-
-      if (gdk_rectangle_equal (&parent_priv->clip, &union_rect))
-        break;
-
-      parent_priv->clip = union_rect;
-      priv = parent_priv;
-    }
 }
 
 /*